草庐IT

c++ - Visual C++ volatile

全部标签

c - 僵尸进程无需等待即可删除 C

我有一个子进程,它只是exit(0)。它变成了僵尸。有没有办法在父进程中没有wait或waitpid的情况下删除它?R+./server//parentR+./server//childZ+(server)//childzombie 最佳答案 您可以捕获SIGCHLD信号(例如使用sigaction(2)等...)。请注意,很少有函数可以从信号处理程序中安全调用。多读几遍signal(7)&signal-safety(7).在信号处理程序内部做的一件好事是设置一些volatilesigatomic_t标志(您稍后会在信号处理程序的外

c - netfilter_queue 虚假数据包

我正在使用netfilter队列库实现用户空间防火墙。我使用nfq_fd()获得了队列的文件描述符,因此我可以调用recv(fd,recv_buf,BUFFERSIZE,MSG_DONTWAIT)来获取数据包数据而不会阻塞。但有时recv()在我每次调用它时都会开始返回52字节的数据包。如果我检查iptables-nvLINPUT的输出,数据包的数量不会增加,所以它们实际上并不是从网络发送的。Edit3:当我向nfq_handle_packet()传递其中一个奇怪的数据包时,它返回-1,并且它永远不会触发回调函数,因此我无法获取数据包ID或返回结论。为什么recv()给我这些奇怪的数据

c - netfilter_queue 虚假数据包

我正在使用netfilter队列库实现用户空间防火墙。我使用nfq_fd()获得了队列的文件描述符,因此我可以调用recv(fd,recv_buf,BUFFERSIZE,MSG_DONTWAIT)来获取数据包数据而不会阻塞。但有时recv()在我每次调用它时都会开始返回52字节的数据包。如果我检查iptables-nvLINPUT的输出,数据包的数量不会增加,所以它们实际上并不是从网络发送的。Edit3:当我向nfq_handle_packet()传递其中一个奇怪的数据包时,它返回-1,并且它永远不会触发回调函数,因此我无法获取数据包ID或返回结论。为什么recv()给我这些奇怪的数据

c - 如果我捕捉到 SIGSEGV 并且信号处理程序导致另一个 SIGSEGV,会发生什么情况?

这个问题是针对Linux提出的。使用GCC编译器。如果SIGSEGV(我的意思是通常会导致SIGSEGV的违规行为)发生在旨在捕获SIGSEGV的信号处理程序中,可以预期会有什么行为?有助于讨论的代码示例:/*Inmainorwhatever*/{structsigactionsa={};/*initialisedtoallzero(IvoteforGCCstylebreachofstandardhere)*/sa.sa_handler=DisasterSignals;sa.sa_flags=SA_RESETHAND|SA_NODEFER;/*Tohaveorhavenot*/siga

c - 如果我捕捉到 SIGSEGV 并且信号处理程序导致另一个 SIGSEGV,会发生什么情况?

这个问题是针对Linux提出的。使用GCC编译器。如果SIGSEGV(我的意思是通常会导致SIGSEGV的违规行为)发生在旨在捕获SIGSEGV的信号处理程序中,可以预期会有什么行为?有助于讨论的代码示例:/*Inmainorwhatever*/{structsigactionsa={};/*initialisedtoallzero(IvoteforGCCstylebreachofstandardhere)*/sa.sa_handler=DisasterSignals;sa.sa_flags=SA_RESETHAND|SA_NODEFER;/*Tohaveorhavenot*/siga

c - 如何定义要运行几秒/分钟的循环

我的目的是在定义的时间内执行while循环(例如,本例中为90秒)。它不必正好是90秒,但1-2秒的误差是可以接受的。为此,我确实使用了clock()`函数:intmain(void){clock_tstart,end;volatiledoubleelapsed;start=clock();intterminate=1;while(terminate){end=clock();elapsed=((double)(end-start))/(double)CLOCKS_PER_SEC*1000;printf("elapsedtime:%f\n",elapsed);if(elapsed>=9

c - 如何定义要运行几秒/分钟的循环

我的目的是在定义的时间内执行while循环(例如,本例中为90秒)。它不必正好是90秒,但1-2秒的误差是可以接受的。为此,我确实使用了clock()`函数:intmain(void){clock_tstart,end;volatiledoubleelapsed;start=clock();intterminate=1;while(terminate){end=clock();elapsed=((double)(end-start))/(double)CLOCKS_PER_SEC*1000;printf("elapsedtime:%f\n",elapsed);if(elapsed>=9

c - 反调试 : gdb does not write 0xcc byte for breakpoints. 知道为什么吗?

我正在学习Linux上的一些反调试技术,发现了一段代码,用于检查内存中的0xcc字节以检测gdb中的断点。这是代码:if((*(volatileunsigned*)((unsigned)foo+3)&0xff)==0xcc){printf("BREAKPOINT\n");exit(1);}foo();但它不起作用。我什至尝试在foo()函数上设置断点并观察内存中的内容,但没有看到任何为断点写入的0xcc字节。这是我所做的:(gdb)bfooBreakpoint1at0x804846a:filep4.c,line8.(gdb)x/x0x804846a0x804846a:0xe02404c

c - 反调试 : gdb does not write 0xcc byte for breakpoints. 知道为什么吗?

我正在学习Linux上的一些反调试技术,发现了一段代码,用于检查内存中的0xcc字节以检测gdb中的断点。这是代码:if((*(volatileunsigned*)((unsigned)foo+3)&0xff)==0xcc){printf("BREAKPOINT\n");exit(1);}foo();但它不起作用。我什至尝试在foo()函数上设置断点并观察内存中的内容,但没有看到任何为断点写入的0xcc字节。这是我所做的:(gdb)bfooBreakpoint1at0x804846a:filep4.c,line8.(gdb)x/x0x804846a0x804846a:0xe02404c

c - 防止 gcc 内联函数

这个问题在这里已经有了答案:HowcanItellgccnottoinlineafunction?(8个答案)关闭7年前。是否可以防止gcc编译器内联特定函数。如果是这样,如何?不要告诉我降低优化级别。我想要所有的优化,但是标记一个特定的函数不被编译器内联,就像变量的volatile一样。我想这样做的原因是因为我的函数使用内联汇编定义的标签,当gcc内联函数时,gcc搞砸了,因为内联导致gcc创建该标签的多个实例。